package java_thinking.unit_18_IO._18_1;

import java.io.File;
import java.io.IOException;

/**
 * @Desc:   创建一个工具，它可以在目录中穿行，并且根据Strategy对象来处理这些目录中的文件(
 *          这是策略设计模式的另一个示例)
 * @author: cww
 * @DateTime: 2019-05-12 19:54
 */

public class ProcessFiles {
    /**
     * 接口内嵌
     */
    public interface Strategy {
        void process(File file);
    }
    private Strategy strategy;
    private String ext;
    public ProcessFiles(Strategy strategy, String ext) {
        this.strategy = strategy;
        this.ext = ext;
    }
    public void start(String[] args) {
        try {
            if (args.length == 0) {
                processDirectoryTree(new File("."));
            } else {
                for (String arg : args) {
                    File fileArg = new File(arg);
                    if (fileArg.isDirectory()) {
                        processDirectoryTree(fileArg);
                    } else {
                        if (!arg.endsWith("." + ext)) {
                            arg += "." + ext;
                        }
                        strategy.process(new File(arg).getCanonicalFile());
                    }
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 特殊扩展名匹配支持
     */
    public void processDirectoryTree(File root) throws IOException {
        // .* 就是单个字符匹配任意次，即贪婪匹配
        // \. 匹配 "."
        //最终搭配ext 意思就是*.java名称匹配
        for (File file : Directory.walk(root.getAbsoluteFile(), ".*\\." + ext)) {
            //当匹配到，则把相关信息传递给Strategy做相关处理
            strategy.process(file.getCanonicalFile());
        }
    }

    public static void main(String[] args) {
        new ProcessFiles(new ProcessFiles.Strategy(){
            @Override
            public void process(File file) {
                System.out.println(file);
            }
        },"txt").start(new String[]{"test4"});
    }
}
